using System;
using System.Collections.Generic;
using System.Xml;
using System.Collections.ObjectModel;

namespace planning
{
	public class Cours : Enseignement
	{
		// ----- ATTRIBUTS -----


		// ----- CONSTRUCTEURS -----
		public Cours()
		{
			// Start of user code for default constructor
			// End of user code for default constructor
		}

		// ----- ACCESSEURS -----



		private static Dictionary<string, Cours> references = new Dictionary<string, Cours>();

		public static new Cours fromXml(XmlNode node)
		{
			Cours cours;
			XmlNode refAttribute = node.SelectSingleNode("@ref");
			XmlNode idAttribute = node.SelectSingleNode("@id");

			if(refAttribute != null) {
				if(references.ContainsKey(refAttribute.Value)) {
					return references[refAttribute.Value];
				} else {
					cours = new Cours();
					references.Add(refAttribute.Value, cours);
					return cours;
				}
			}

			if(idAttribute != null && references.ContainsKey(idAttribute.Value)) {
				cours = references[idAttribute.Value];
			} else {
				cours = new Cours();

				if(idAttribute != null) {
					references.Add(idAttribute.Value, cours);
				}
			}

			if(node.SelectSingleNode("@groupe") != null)
				cours.Groupe = (NumeroGroupe) Enum.Parse(typeof(NumeroGroupe), node.SelectSingleNode("@groupe").Value);

			foreach (XmlNode subElement in node.SelectNodes("horaires/*"))
			{
				Horaire subObject = Horaire.fromXml(subElement);
				cours.Horaires.Add(subObject);
			}

			if(node.SelectSingleNode("./matiere/*") != null)
				cours.Matiere = Matiere.fromXml(node.SelectSingleNode("./matiere/*"));

			if(node.SelectSingleNode("./enseignant/*") != null)
				cours.Enseignant = Enseignant.fromXml(node.SelectSingleNode("./enseignant/*"));

			if(node.SelectSingleNode("./salle/*") != null)
				cours.Salle = Salle.fromXml(node.SelectSingleNode("./salle/*"));

			

			return cours;

		}

		public virtual XmlElement toXml(XmlDocument document)
		{
			// Start of user code for toXml
            XmlElement element = document.CreateElement("Cours");
            XmlAttribute groupeAttribute = document.CreateAttribute("groupe");
            groupeAttribute.Value = Groupe.ToString();
            element.AppendChild(groupeAttribute);

            XmlElement horairesElement = document.CreateElement("horaires");
            element.AppendChild(horairesElement);
            foreach (Horaire subObject in Horaires)
            {
                horairesElement.AppendChild(subObject.toXml(document));
            }

            XmlElement divisionElement = document.CreateElement("matiere");
            divisionElement.AppendChild(Matiere.toXml(document));
            element.AppendChild(divisionElement);

            XmlElement enseignantElement = document.CreateElement("enseignant");
            enseignantElement.AppendChild(Enseignant.toXml(document));
            element.AppendChild(enseignantElement);

            XmlElement salleElement = document.CreateElement("salle");
            salleElement.AppendChild(Salle.toXml(document));
            element.AppendChild(salleElement);

            return element;
			// End of user code for toXml
		}


	}

}
